package com.dengcj.epl.service.util;

import cn.hutool.db.Entity;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author dengchunjie
 * @Description: 节点附加操作数据处理工具类
 * @date 2022/2/28 16:48
 */
public class RequestDataProcessUtil {

    /**
     * 获取当前流程明细表某个字段的合计
     * @param dtData 明细表数据
     * @param fieldName 需要合计的字段名（仅支持数字类型的字段）
     * @return
     */
    public double getDtColSum(List<Entity> dtData, String fieldName) {
        //return dtData.stream().collect(Collectors.summingDouble(entity->entity.getDouble(fieldName)));
        return dtData.stream().mapToDouble(entity->entity.getDouble(fieldName)).sum();
    }

    /**
     * 获取当前流程明细表某个字段的最大值
     * @param dtData 明细表数据
     * @param fieldName 需要求最大值的字段名（仅支持数字类型的字段）
     * @return
     */
    public double getDtColMax(List<Entity> dtData, String fieldName){
        return dtData.stream().mapToDouble(entity->entity.getDouble(fieldName)).max().getAsDouble();
    }

    /**
     * 获取当前流程明细表某个字段的最小值
     * @param dtData 明细表数据
     * @param fieldName 需要求最小值的字段名（仅支持数字类型的字段）
     * @return
     */
    public double getDtColMin(List<Entity> dtData, String fieldName){
        return dtData.stream().mapToDouble(entity->entity.getDouble(fieldName)).min().getAsDouble();
    }

    /**
     * 获取当前流程明细表某个字段的平均值
     * @param dtData 明细表数据
     * @param fieldName 需要求平均值的字段名（仅支持数字类型的字段）
     * @return
     */
    public double getDtColAvg(List<Entity> dtData, String fieldName){
        return dtData.stream().mapToDouble(entity->entity.getDouble(fieldName)).average().getAsDouble();
    }

    /**
     * 对数据进行分组
     * @param dtData 源数据
     * @param fieldName 分组字段
     * @return
     */
    public Map<String, List<Entity>> groupBy(List<Entity> dtData, String fieldName){
        return dtData.stream().collect(Collectors.groupingBy(entity -> entity.getStr(fieldName)));
    }

    /**
     * 分组求合计
     * @param dtData 源数据
     * @param sumFieldName 求和字段
     * @param groupByFieldName 分组字段
     * @return
     */
    public Map<String,Double> groupBySum(List<Entity> dtData, String sumFieldName, String groupByFieldName){
        return dtData.stream().collect(Collectors.groupingBy(entity -> entity.getStr(groupByFieldName), Collectors.summingDouble(entity -> entity.getDouble(sumFieldName))));
    }


    /**
     * 分组及个数
     * @param dtData
     * @param groupByFieldName
     * @return
     */
    public Map<String,Long> groupByCount(List<Entity> dtData, String groupByFieldName){
        return dtData.stream().collect(Collectors.groupingBy(entity -> entity.getStr(groupByFieldName), Collectors.counting()));
    }
}
